package service

import (
	"gin_server/config"

	"fmt"
	"mime/multipart"
	"os"
	"path/filepath"
)

// UploadService 文件上传服务接口
type UploadService interface {
	SaveFile(file *multipart.FileHeader, fileKey string) (string, error)
}

// uploadService 文件上传服务实现
type uploadService struct{}

// NewUploadService 创建文件上传服务实例
func NewUploadService() UploadService {
	return &uploadService{}
}

// SaveFile 保存上传的文件
func (s *uploadService) SaveFile(file *multipart.FileHeader, fileKey string) (string, error) {
	// 设置上传目录
	uploadDir := config.AppConfig.Upload.UploadDir

	// 解析fileKey，提取目录结构和文件名
	keyDir := filepath.Dir(fileKey)
	keyFilename := filepath.Base(fileKey)

	// 构建完整的目录路径
	fullDir := filepath.Join(uploadDir, keyDir)

	// 创建目录（包括所有必要的父目录）
	if err := os.MkdirAll(fullDir, 0755); err != nil {
		return "", fmt.Errorf("创建目录失败: %w", err)
	}

	// 构建保存路径
	savePath := filepath.Join(fullDir, keyFilename)

	// 保存文件
	if err := s.saveFileToDisk(file, savePath); err != nil {
		return "", fmt.Errorf("保存文件失败: %w", err)
	}

	return fileKey, nil
}

// saveFileToDisk 将文件保存到磁盘
func (s *uploadService) saveFileToDisk(file *multipart.FileHeader, dst string) error {
	src, err := file.Open()
	if err != nil {
		return err
	}
	defer src.Close()

	out, err := os.Create(dst)
	if err != nil {
		return err
	}
	defer out.Close()

	// 复制文件内容
	buf := make([]byte, 1024*1024) // 1MB缓冲区
	for {
		n, err := src.Read(buf)
		if err != nil {
			if err.Error() == "EOF" {
				break
			}
			return err
		}

		if n > 0 {
			if _, err := out.Write(buf[:n]); err != nil {
				return err
			}
		}
	}

	return nil
}
